home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / extra / setfiledate.c < prev    next >
C/C++ Source or Header  |  1990-06-20  |  2KB  |  85 lines

  1.  
  2.  
  3. /*
  4.  *  SETFILEDATE.C
  5.  *
  6.  *  BOOL = setfiledate(filename, date)
  7.  */
  8.  
  9. #include <exec/types.h>
  10. #include <exec/memory.h>
  11. #include <string.h>
  12. #include <libraries/dos.h>
  13. #include <libraries/dosextens.h>
  14.  
  15. #define BTOC(bptr)  ((void *)((long)bptr << 2))
  16. #define CTOB(cptr)  ((BPTR)((long)cptr >> 2))
  17.  
  18. typedef void *Pointer;
  19.  
  20. #ifndef ACTION_SET_DATE
  21. #define ACTION_SET_DATE 34
  22. #endif
  23.  
  24. typedef struct StandardPacket STDPKT;
  25. typedef struct Process          PROC;
  26. typedef struct DateStamp      DATESTAMP;
  27. typedef struct FileLock       LOCK;
  28. typedef struct Message          MSG;
  29.  
  30. extern void *AllocMem();
  31. extern BPTR ParentDir();
  32. extern BPTR Lock();
  33.  
  34. int
  35. SetFileDate(file, date)
  36. char *file;
  37. DATESTAMP *date;
  38. {
  39.     STDPKT *packet;
  40.     char   *buf;
  41.     PROC   *proc;
  42.     long   result;
  43.     BPTR   lock;
  44.     BPTR   flock = Lock(file, SHARED_LOCK);
  45.     short  i;
  46.     char *ptr = file;
  47.  
  48.     {
  49.     if (flock == NULL)
  50.         return(NULL);
  51.     lock = ParentDir(flock);
  52.     UnLock(flock);
  53.     if (!lock)
  54.         return(NULL);
  55.     for (i = strlen(ptr) - 1; i >= 0; --i) {
  56.         if (ptr[i] == '/' || ptr[i] == ':')
  57.         break;
  58.     }
  59.     file += i + 1;
  60.     }
  61.     proc   = (PROC *)FindTask(NULL);
  62.     packet = (STDPKT   *)AllocMem(sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
  63.     buf = AllocMem(strlen(file)+2, MEMF_PUBLIC);
  64.     strcpy(buf+1,file);
  65.     buf[0] = strlen(file);
  66.  
  67.     packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  68.     packet->sp_Pkt.dp_Link = &packet->sp_Msg;
  69.     packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
  70.     packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
  71.     packet->sp_Pkt.dp_Arg1 = NULL;
  72.     packet->sp_Pkt.dp_Arg2 = (long)lock;        /*  lock on parent dir of file  */
  73.     packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);   /*  BPTR to BSTR of file name   */
  74.     packet->sp_Pkt.dp_Arg4 = (long)date;        /*  APTR to datestamp structure */
  75.     PutMsg(((LOCK *)BTOC(lock))->fl_Task, (MSG *)packet);
  76.     WaitPort(&proc->pr_MsgPort);
  77.     GetMsg(&proc->pr_MsgPort);
  78.     result = packet->sp_Pkt.dp_Res1;
  79.     FreeMem(packet, sizeof(STDPKT));
  80.     FreeMem(buf, strlen(file)+2);
  81.     UnLock(lock);
  82.     return(result);
  83. }
  84.  
  85.